import axios from 'axios'
import qs from 'qs'
// 打包环境--公司
// var root = 'http://topsmart.xyz:1314/';
// 打包环境--服务器
// var root = 'http://111.22.209.108:33444/';
//本地nginx测试
// var root = 'http://192.168.0.128:801/';
// 开发环境
var root = 'http://192.168.0.128:1314/';
import {
    getCookie
} from "../utils/auth";
// 注意：在js文件中使用element组件 按照下面更优雅哦~~
import {
    Message,
    MessageBox
} from 'element-ui'
import router from "../router/index"
axios.defaults.timeout = 5000 // 请求超时时间
axios.defaults.baseURL = process.env.VUE_APP_BASE_API
axios.defaults.headers.post['Content-Type'] =
    'application/x-www-form-urlencoded;charset=UTF-8' // post请求头的设置
    //请求拦截
axios.interceptors.request.use((config) => {
    //请求之前重新拼装url
    config.url = root + config.url;
    if (getCookie("casSessionId") != '用户名或密码错误' || getCookie("ACCESS_TOKEN") != '用户名或密码错误') {
        // 打包环境
        axios.defaults.headers.common["casSessionId"] = getCookie("casSessionId") ? getCookie("casSessionId") : ""
            // 开发环境
            // axios.defaults.headers.common["ACCESS_TOKEN"] = getCookie("ACCESS_TOKEN") ? getCookie("ACCESS_TOKEN") : ""
    }
    return config;
});
// axios respone拦截器
axios.interceptors.response.use(
    response => {
        // debugger
        // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
        // 否则的话抛出错误 结合自身业务和后台返回的接口状态约定写respone拦截器
        // Indicator.close()
        if (response.status === 200) {
            if (response.data.code == "401") {
                setTimeout(() => {
                    router.push('login')
                }, 1000);
            } else if (response.data.code == "304") {
                Message({
                    message: response.data.msg,
                    type: 'error',
                    duration: 2 * 1000
                })
            } else if (response.data.code == "4000") {
                Message({
                    message: response.data.msg,
                    type: 'error',
                    duration: 2 * 1000
                })
            } else {
                return Promise.resolve(response)
            }
        } else {
            Message({
                message: error.message,
                type: 'error',
                duration: 2 * 1000
            })
            return Promise.reject(response)
        }

    },
    error => {
        // Indicator.close()
        const responseCode = error.response.status
        switch (responseCode) {
            // 401：未登录
            case 401:
                this._vm.$store.commit("userModule/LOGOUT_CLEAR_USER");
                setTimeout(() => {
                    router.push('login')
                }, 1000);
                break
                // 404请求不存在
            case 404:
                Message({
                    message: error.message,
                    type: 'error',
                    duration: 2 * 1000
                })
                break
            default:
                Message({
                    message: '请求服务出错',
                    type: 'error',
                    duration: 2 * 1000
                })
        }

        return Promise.reject(error.response)
    }
)

/**
 * 封装get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function get(url, params = {}) {
    return new Promise((resolve, reject) => {
            axios
                .get(url, {
                    params: params
                })
                .then(res => {
                    resolve(res)
                })
                .catch(err => {
                    reject(err)
                })
        })
        // 或者return axios.get();
}

/**
 * form方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function form(url, params) {
    return new Promise((resolve, reject) => {
            axios
                .post(url, qs.stringify(params))
                .then(res => {
                    resolve(res);
                })
                .catch(err => {
                    reject(err)
                })
        })
        //  或者return axios.post();
}

/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function post(url, params) {
    return new Promise((resolve, reject) => {
            axios
                .post(url, qs.parse(params))
                .then(res => {
                    resolve(res)
                })
                .catch(err => {
                    reject(err)
                })
        })
        //  或者return axios.post();
}

/**
 * delete方法，对应delete请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function Delete(url, params) {
    return new Promise((resolve, reject) => {
            axios
                .delete(url, {
                    params: params
                })
                .then(res => {
                    resolve(res)
                })
                .catch(err => {
                    reject(err)
                })
        })
        //  或者return axios.post();
}

/**
 * put，对应put请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function put(url, params) {
    return new Promise((resolve, reject) => {
            axios
                .put(url, qs.parse(params))
                .then(res => {
                    resolve(res)
                })
                .catch(err => {
                    reject(err)
                })
        })
        //  或者return axios.post();
}

export {
    get,
    post,
    form,
    Delete,
    put
}